library(wigglescout)
library(ggplot2)
RStudio Community is a great place to get help: https://community.rstudio.com/c/tidyverse
library(reshape2)
library(dplyr)
Attaching package: ‘dplyr’
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
library(ggpubr)
Registered S3 method overwritten by 'data.table':
method from
print.data.table
library(GenomicRanges)
Loading required package: stats4
Loading required package: BiocGenerics
Loading required package: parallel
Attaching package: ‘BiocGenerics’
The following objects are masked from ‘package:parallel’:
clusterApply, clusterApplyLB, clusterCall, clusterEvalQ, clusterExport, clusterMap, parApply,
parCapply, parLapply, parLapplyLB, parRapply, parSapply, parSapplyLB
The following objects are masked from ‘package:dplyr’:
combine, intersect, setdiff, union
The following objects are masked from ‘package:stats’:
IQR, mad, sd, var, xtabs
The following objects are masked from ‘package:base’:
anyDuplicated, append, as.data.frame, basename, cbind, colnames, dirname, do.call, duplicated, eval,
evalq, Filter, Find, get, grep, grepl, intersect, is.unsorted, lapply, Map, mapply, match, mget, order,
paste, pmax, pmax.int, pmin, pmin.int, Position, rank, rbind, Reduce, rownames, sapply, setdiff, sort,
table, tapply, union, unique, unsplit, which.max, which.min
Loading required package: S4Vectors
Attaching package: ‘S4Vectors’
The following objects are masked from ‘package:dplyr’:
first, rename
The following object is masked from ‘package:base’:
expand.grid
Loading required package: IRanges
Attaching package: ‘IRanges’
The following objects are masked from ‘package:dplyr’:
collapse, desc, slice
Loading required package: GenomeInfoDb
source('../lib/lib_embed_data.v1.0.R')
Loading required package: xfun
Attaching package: ‘xfun’
The following objects are masked from ‘package:base’:
attr, isFALSE
data_path <- '/Volumes/DATA/DATA/GLOE/GLOE/replicates/'
replicates <- c("WT-UT-1-1","WT-UT-1-2","WT-UT-1-3","WT-20-2-1","WT-20-2-2","WT-20-2-3","WT-24hr-3-1","WT-24hr-3-2","WT-24hr-3-3","KO-UT-4-1","KO-UT-4-2","KO-UT-4-3","KO-20-5-1","KO-20-5-2","KO-20-5-3","KO-24hr-6-1","KO-24hr-6-2","KO-24hr-6-3")
samples <- c("WT-UT-1","WT-20-2","WT-24hr-3","KO-UT-4","KO-20-5","KO-24hr-6")
build_filenames <- function(path, cond) {
files <- paste0(path,"/GL-",cond,".hg19.bs50.bw")
labels <- paste0("GLOE ", cond)
return(data.frame(files=files,labels=labels))
}
build_filenames_plus <- function(path, cond) {
files <- paste0(path,"/GL-",cond,".hg19.R1plus.bw")
labels <- paste0("GLOE (+) ", cond)
return(data.frame(files=files,labels=labels))
}
build_filenames_minus <- function(path, cond) {
files <- paste0(path,"//GL-",cond,".hg19.R1minus.bw")
labels <- paste0("GLOE (-) ", cond)
return(data.frame(files=files,labels=labels))
}
Published peaksets (Cistrome)
Here, we are comparing profiles accross known accessible, DNAase hypersensitive regions, and CTCF peaks Note: unlike in previous plots, we clearly see now a correlation of CAD activity and accessible chromatin. Plotting average profiles on scarce read data can be thrown of by artifact regions. These artifacts are avoided here by 1) using a blacklist to remove known repetitive/artifact-prone regions and 2) removing outliers (top 0.1%) of the signal before averaging.
fn <- build_filenames(data_path,samples)
p1 <- plot_bw_profile(bwfiles = fn$files,labels = fn$labels,mode = "center",upstream = 1000, downstream = 1000, loci = "../genome/HCT116_ATACseq.hg19.bed", bin_size = 10 ,remove_top = 0.001, verbose=F)
p2 <- plot_bw_profile(bwfiles = fn$files,labels = fn$labels,mode = "center",upstream = 1000, downstream = 1000, loci = "../genome/HCT116_CTCF.hg19.bed", bin_size = 10 ,remove_top = 0.001, verbose=F)
p3 <- plot_bw_profile(bwfiles = fn$files,labels = fn$labels,mode = "center",upstream = 1000, downstream = 1000, loci = "../genome/HCT116_DHS.hg19.bed", bin_size = 10 ,remove_top = 0.001, verbose=F)
ggarrange(p1, p2, p3, ncol = 3, nrow = 1)

Pileup regions = ‘hypersensitive breakpoints’
Given the overall low coverage/incidence of SSB in the genome, a coincidence of several SSBs in the same location (or even exact same base pair) is highly unlikely to occur by chance. Noticing that around CTCF sites, uniqe GLOE-Seq reads piled up neatly (some with exact same starting base), I developed a pipeline that looks for such pileups. There are ~40 of these regions identified, which I would call ‘hypersensitive’. There may be many more but it is not possible to call them confidently.
fn <- build_filenames(data_path,samples)
p1 <- plot_bw_profile(bwfiles = fn$files,labels = fn$labels,mode = "center",upstream = 1000, downstream = 1000, loci = "../data/pileup/GL-WT-24hr-3.pile_up3_s10_u.uniq.bed", bin_size = 10, verbose = F) + scale_y_continuous(limits=c(0,45))
p3 <- plot_bw_profile(bwfiles = fn$files,labels = fn$labels,mode = "center",upstream = 1000, downstream = 1000, loci = "../data/pileup/GL-WT-24hr-3.pile_up3_s10_u.shuffled.bed", bin_size = 10, verbose = F) + scale_y_continuous(limits=c(0,45))
fn <- build_filenames(data_path,replicates[c(7,8,9,16,17,18)])
p2 <- plot_bw_profile(bwfiles = fn$files,labels = fn$labels,mode = "center",upstream = 1000, downstream = 1000, loci = "../data/pileup/GL-WT-24hr-3.pile_up3_s10_u.uniq.bed", bin_size = 10, verbose = F) + scale_y_continuous(limits=c(0,45))
embed_plot(p1,"CAD-peaks")
Saving 7 x 7 in image
Download CAD-peaks.pdf
embed_plot(p1,"CAD-peaks.rep")
Download CAD-peaks.rep.pdf
embed_plot(p1,"CAD-ctrl")
Download CAD-ctrl.pdf
ggarrange(p1, p2, p3, ncol = 3, nrow = 1)

Heatmaps of the same regions
fn <- build_filenames(data_path,samples)
p1 <- plot_bw_heatmap(bwfile = fn$files[1], mode = "center",upstream = 1000, downstream = 1000, loci = "../data/pileup/GL-WT-24hr-3.pile_up3_s10_u.uniq.bed", bin_size = 10, verbose = F,zmax = 50)
p2 <- plot_bw_heatmap(bwfile = fn$files[2], mode = "center",upstream = 1000, downstream = 1000, loci = "../data/pileup/GL-WT-24hr-3.pile_up3_s10_u.uniq.bed", bin_size = 10, verbose = F,zmax = 50)
p3 <- plot_bw_heatmap(bwfile = fn$files[3], mode = "center",upstream = 1000, downstream = 1000, loci = "../data/pileup/GL-WT-24hr-3.pile_up3_s10_u.uniq.bed", bin_size = 10, verbose = F,zmax = 50)
p4 <- plot_bw_heatmap(bwfile = fn$files[4], mode = "center",upstream = 1000, downstream = 1000, loci = "../data/pileup/GL-WT-24hr-3.pile_up3_s10_u.uniq.bed", bin_size = 10, verbose = F,zmax = 50)
p5 <- plot_bw_heatmap(bwfile = fn$files[5], mode = "center",upstream = 1000, downstream = 1000, loci = "../data/pileup/GL-WT-24hr-3.pile_up3_s10_u.uniq.bed", bin_size = 10, verbose = F,zmax = 50)
p6 <- plot_bw_heatmap(bwfile = fn$files[6], mode = "center",upstream = 1000, downstream = 1000, loci = "../data/pileup/GL-WT-24hr-3.pile_up3_s10_u.uniq.bed", bin_size = 10, verbose = F,zmax = 50)
ggarrange(p1, p2, p3, p4, p5, p6, ncol = 6, nrow = 1)

CTCF sites - spacing relative to nucleosomes and linker histone
around CTCF sites, the GLOE-seq signal looked very periodic, which suggested that there could be a relationship to nucleosome occupancy. Indeed, the pattern is consistent with CAD cutting left and right of linker histone / in-between linker histone and nucleosome. Note that the same periodicity is also seen in untreated and CAD KO conditions, albeit much less pronounced, suggesting that CAD-independent SSBs are also occuring more often in-between nucleosomes.

DNase hypersensitive sites - spacing relative to nucleosomes and linker histone
With the removal of artifactual regions, we now also can see a neatly spaced pattern at DNAse hypersensitive sites.
p4<- plot_bw_profile(bwfiles = c(plus$files[3],minus$files[3]),labels = c("WT 24h +","WT 24h -"),mode = "center",upstream = 1000, downstream = 1000, loci = "../genome/HCT116_DHS.hg19.bed", bin_size = 10, verbose = F, remove_top = 0.0001)
p4<- plot_bw_profile(bwfiles = c(plus$files[3],minus$files[3]),labels = c("WT 24h +","WT 24h -"),mode = "center",upstream = 1000, downstream = 1000, loci = "../genome/HCT116_DHS.hg19.bed", bin_size = 10, verbose = F, remove_top = 0.0001)
p5 <- plot_bw_profile(bwfiles = plus$files[c(1,3,6)],labels = plus$labels[c(1,3,6)],mode = "center",upstream = 1000, downstream = 1000, loci = "../genome/HCT116_DHS.hg19.bed", bin_size = 10, verbose = F, remove_top = 0.0001)
p6 <- plot_bw_profile(bwfiles = minus$files[c(1,3,6)],labels = minus$labels[c(1,3,6)],mode = "center",upstream = 1000, downstream = 1000, loci = "../genome/HCT116_DHS.hg19.bed", bin_size = 10, verbose = F, remove_top = 0.0001)
ggarrange(p1, p2, p3, p4, p5, p6, ncol = 3, nrow = 2)

LS0tCnRpdGxlOiAiR0xPRS1TZXEgYW5hbHlzaXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHdhcm5pbmc9RkFMU0V9CgpsaWJyYXJ5KHdpZ2dsZXNjb3V0KQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwdWJyKQpsaWJyYXJ5KEdlbm9taWNSYW5nZXMpCgoKc291cmNlKCcuLi9saWIvbGliX2VtYmVkX2RhdGEudjEuMC5SJykKCmRhdGFfcGF0aCA8LSAnL1ZvbHVtZXMvREFUQS9EQVRBL0dMT0UvR0xPRS9yZXBsaWNhdGVzLycKCnJlcGxpY2F0ZXMgPC0gYygiV1QtVVQtMS0xIiwiV1QtVVQtMS0yIiwiV1QtVVQtMS0zIiwiV1QtMjAtMi0xIiwiV1QtMjAtMi0yIiwiV1QtMjAtMi0zIiwiV1QtMjRoci0zLTEiLCJXVC0yNGhyLTMtMiIsIldULTI0aHItMy0zIiwiS08tVVQtNC0xIiwiS08tVVQtNC0yIiwiS08tVVQtNC0zIiwiS08tMjAtNS0xIiwiS08tMjAtNS0yIiwiS08tMjAtNS0zIiwiS08tMjRoci02LTEiLCJLTy0yNGhyLTYtMiIsIktPLTI0aHItNi0zIikKc2FtcGxlcyA8LSBjKCJXVC1VVC0xIiwiV1QtMjAtMiIsIldULTI0aHItMyIsIktPLVVULTQiLCJLTy0yMC01IiwiS08tMjRoci02IikKCmJ1aWxkX2ZpbGVuYW1lcyA8LSBmdW5jdGlvbihwYXRoLCBjb25kKSB7CiAgZmlsZXMgPC0gcGFzdGUwKHBhdGgsIi9HTC0iLGNvbmQsIi5oZzE5LmJzNTAuYnciKQogIGxhYmVscyA8LSBwYXN0ZTAoIkdMT0UgIiwgY29uZCkKICByZXR1cm4oZGF0YS5mcmFtZShmaWxlcz1maWxlcyxsYWJlbHM9bGFiZWxzKSkKfQoKYnVpbGRfZmlsZW5hbWVzX3BsdXMgPC0gZnVuY3Rpb24ocGF0aCwgY29uZCkgewogIGZpbGVzIDwtIHBhc3RlMChwYXRoLCIvR0wtIixjb25kLCIuaGcxOS5SMXBsdXMuYnciKQogIGxhYmVscyA8LSBwYXN0ZTAoIkdMT0UgKCspICIsIGNvbmQpCiAgcmV0dXJuKGRhdGEuZnJhbWUoZmlsZXM9ZmlsZXMsbGFiZWxzPWxhYmVscykpCn0KCmJ1aWxkX2ZpbGVuYW1lc19taW51cyA8LSBmdW5jdGlvbihwYXRoLCBjb25kKSB7CiAgZmlsZXMgPC0gcGFzdGUwKHBhdGgsIi8vR0wtIixjb25kLCIuaGcxOS5SMW1pbnVzLmJ3IikKICBsYWJlbHMgPC0gcGFzdGUwKCJHTE9FICgtKSAiLCBjb25kKQogIHJldHVybihkYXRhLmZyYW1lKGZpbGVzPWZpbGVzLGxhYmVscz1sYWJlbHMpKQp9CgpgYGAKCiMjIFB1Ymxpc2hlZCBwZWFrc2V0cyAoQ2lzdHJvbWUpCgpIZXJlLCB3ZSBhcmUgY29tcGFyaW5nIHByb2ZpbGVzIGFjY3Jvc3Mga25vd24gYWNjZXNzaWJsZSwgRE5BYXNlIGh5cGVyc2Vuc2l0aXZlIHJlZ2lvbnMsIGFuZCBDVENGIHBlYWtzCipOb3RlOiB1bmxpa2UgaW4gcHJldmlvdXMgcGxvdHMsIHdlIGNsZWFybHkgc2VlIG5vdyBhIGNvcnJlbGF0aW9uIG9mIENBRCBhY3Rpdml0eSBhbmQgYWNjZXNzaWJsZSBjaHJvbWF0aW4uIFBsb3R0aW5nIGF2ZXJhZ2UgcHJvZmlsZXMgb24gc2NhcmNlIHJlYWQgZGF0YSBjYW4gYmUgdGhyb3duIG9mIGJ5IGFydGlmYWN0IHJlZ2lvbnMuIFRoZXNlIGFydGlmYWN0cyBhcmUgYXZvaWRlZCBoZXJlIGJ5IDEpIHVzaW5nIGEgYmxhY2tsaXN0IHRvIHJlbW92ZSBrbm93biByZXBldGl0aXZlL2FydGlmYWN0LXByb25lIHJlZ2lvbnMgYW5kIDIpIHJlbW92aW5nIG91dGxpZXJzICh0b3AgMC4xJSkgb2YgdGhlIHNpZ25hbCBiZWZvcmUgYXZlcmFnaW5nLioKCmBgYHtyIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSAyfQpmbiA8LSBidWlsZF9maWxlbmFtZXMoZGF0YV9wYXRoLHNhbXBsZXMpCgpwMSA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGZuJGZpbGVzLGxhYmVscyA9IGZuJGxhYmVscyxtb2RlID0gImNlbnRlciIsdXBzdHJlYW0gPSAxMDAwLCBkb3duc3RyZWFtID0gMTAwMCwgbG9jaSA9ICIuLi9nZW5vbWUvSENUMTE2X0FUQUNzZXEuaGcxOS5iZWQiLCBiaW5fc2l6ZSA9IDEwICxyZW1vdmVfdG9wID0gMC4wMDEsIHZlcmJvc2U9RikKcDIgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBmbiRmaWxlcyxsYWJlbHMgPSBmbiRsYWJlbHMsbW9kZSA9ICJjZW50ZXIiLHVwc3RyZWFtID0gMTAwMCwgZG93bnN0cmVhbSA9IDEwMDAsIGxvY2kgPSAiLi4vZ2Vub21lL0hDVDExNl9DVENGLmhnMTkuYmVkIiwgYmluX3NpemUgPSAxMCAscmVtb3ZlX3RvcCA9IDAuMDAxLCB2ZXJib3NlPUYpCnAzIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gZm4kZmlsZXMsbGFiZWxzID0gZm4kbGFiZWxzLG1vZGUgPSAiY2VudGVyIix1cHN0cmVhbSA9IDEwMDAsIGRvd25zdHJlYW0gPSAxMDAwLCBsb2NpID0gIi4uL2dlbm9tZS9IQ1QxMTZfREhTLmhnMTkuYmVkIiwgYmluX3NpemUgPSAxMCAscmVtb3ZlX3RvcCA9IDAuMDAxLCB2ZXJib3NlPUYpCgpnZ2FycmFuZ2UocDEsIHAyLCBwMywgbmNvbCA9IDMsIG5yb3cgPSAxKQpgYGAKCiMjIFBpbGV1cCByZWdpb25zID0gJ2h5cGVyc2Vuc2l0aXZlIGJyZWFrcG9pbnRzJwoKR2l2ZW4gdGhlIG92ZXJhbGwgbG93IGNvdmVyYWdlL2luY2lkZW5jZSBvZiBTU0IgaW4gdGhlIGdlbm9tZSwgYSBjb2luY2lkZW5jZSBvZiBzZXZlcmFsIFNTQnMgaW4gdGhlIHNhbWUgbG9jYXRpb24gKG9yIGV2ZW4gZXhhY3Qgc2FtZSBiYXNlIHBhaXIpIGlzIGhpZ2hseSB1bmxpa2VseSB0byBvY2N1ciBieSBjaGFuY2UuIE5vdGljaW5nIHRoYXQgYXJvdW5kIENUQ0Ygc2l0ZXMsIHVuaXFlIEdMT0UtU2VxIHJlYWRzIHBpbGVkIHVwIG5lYXRseSAoc29tZSB3aXRoIGV4YWN0IHNhbWUgc3RhcnRpbmcgYmFzZSksIEkgZGV2ZWxvcGVkIGEgcGlwZWxpbmUgdGhhdCBsb29rcyBmb3Igc3VjaCBwaWxldXBzLiBUaGVyZSBhcmUgfjQwIG9mIHRoZXNlIHJlZ2lvbnMgaWRlbnRpZmllZCwgd2hpY2ggSSB3b3VsZCBjYWxsICdoeXBlcnNlbnNpdGl2ZScuIFRoZXJlIG1heSBiZSBtYW55IG1vcmUgYnV0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYWxsIHRoZW0gY29uZmlkZW50bHkuCgpgYGB7ciBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gMn0KCmZuIDwtIGJ1aWxkX2ZpbGVuYW1lcyhkYXRhX3BhdGgsc2FtcGxlcykKCnAxIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gZm4kZmlsZXMsbGFiZWxzID0gZm4kbGFiZWxzLG1vZGUgPSAiY2VudGVyIix1cHN0cmVhbSA9IDEwMDAsIGRvd25zdHJlYW0gPSAxMDAwLCBsb2NpID0gIi4uL2RhdGEvcGlsZXVwL0dMLVdULTI0aHItMy5waWxlX3VwM19zMTBfdS51bmlxLmJlZCIsIGJpbl9zaXplID0gMTAsIHZlcmJvc2UgPSBGKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLDQ1KSkKcDMgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBmbiRmaWxlcyxsYWJlbHMgPSBmbiRsYWJlbHMsbW9kZSA9ICJjZW50ZXIiLHVwc3RyZWFtID0gMTAwMCwgZG93bnN0cmVhbSA9IDEwMDAsIGxvY2kgPSAiLi4vZGF0YS9waWxldXAvR0wtV1QtMjRoci0zLnBpbGVfdXAzX3MxMF91LnNodWZmbGVkLmJlZCIsIGJpbl9zaXplID0gMTAsIHZlcmJvc2UgPSBGKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLDQ1KSkKCmZuIDwtIGJ1aWxkX2ZpbGVuYW1lcyhkYXRhX3BhdGgscmVwbGljYXRlc1tjKDcsOCw5LDE2LDE3LDE4KV0pCnAyIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gZm4kZmlsZXMsbGFiZWxzID0gZm4kbGFiZWxzLG1vZGUgPSAiY2VudGVyIix1cHN0cmVhbSA9IDEwMDAsIGRvd25zdHJlYW0gPSAxMDAwLCBsb2NpID0gIi4uL2RhdGEvcGlsZXVwL0dMLVdULTI0aHItMy5waWxlX3VwM19zMTBfdS51bmlxLmJlZCIsIGJpbl9zaXplID0gMTAsIHZlcmJvc2UgPSBGKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLDQ1KSkKCmVtYmVkX3Bsb3QocDEsIkNBRC1wZWFrcyIpCmVtYmVkX3Bsb3QocDEsIkNBRC1wZWFrcy5yZXAiKQplbWJlZF9wbG90KHAxLCJDQUQtY3RybCIpCgpnZ2FycmFuZ2UocDEsIHAyLCBwMywgbmNvbCA9IDMsIG5yb3cgPSAxKQpgYGAKSGVhdG1hcHMgb2YgdGhlIHNhbWUgcmVnaW9ucwpgYGB7ciBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDJ9CgpmbiA8LSBidWlsZF9maWxlbmFtZXMoZGF0YV9wYXRoLHNhbXBsZXMpCnAxIDwtIHBsb3RfYndfaGVhdG1hcChid2ZpbGUgPSBmbiRmaWxlc1sxXSwgbW9kZSA9ICJjZW50ZXIiLHVwc3RyZWFtID0gMTAwMCwgZG93bnN0cmVhbSA9IDEwMDAsIGxvY2kgPSAiLi4vZGF0YS9waWxldXAvR0wtV1QtMjRoci0zLnBpbGVfdXAzX3MxMF91LnVuaXEuYmVkIiwgYmluX3NpemUgPSAxMCwgdmVyYm9zZSA9IEYsem1heCA9IDUwKQpwMiA8LSBwbG90X2J3X2hlYXRtYXAoYndmaWxlID0gZm4kZmlsZXNbMl0sIG1vZGUgPSAiY2VudGVyIix1cHN0cmVhbSA9IDEwMDAsIGRvd25zdHJlYW0gPSAxMDAwLCBsb2NpID0gIi4uL2RhdGEvcGlsZXVwL0dMLVdULTI0aHItMy5waWxlX3VwM19zMTBfdS51bmlxLmJlZCIsIGJpbl9zaXplID0gMTAsIHZlcmJvc2UgPSBGLHptYXggPSA1MCkKcDMgPC0gcGxvdF9id19oZWF0bWFwKGJ3ZmlsZSA9IGZuJGZpbGVzWzNdLCBtb2RlID0gImNlbnRlciIsdXBzdHJlYW0gPSAxMDAwLCBkb3duc3RyZWFtID0gMTAwMCwgbG9jaSA9ICIuLi9kYXRhL3BpbGV1cC9HTC1XVC0yNGhyLTMucGlsZV91cDNfczEwX3UudW5pcS5iZWQiLCBiaW5fc2l6ZSA9IDEwLCB2ZXJib3NlID0gRix6bWF4ID0gNTApCnA0IDwtIHBsb3RfYndfaGVhdG1hcChid2ZpbGUgPSBmbiRmaWxlc1s0XSwgbW9kZSA9ICJjZW50ZXIiLHVwc3RyZWFtID0gMTAwMCwgZG93bnN0cmVhbSA9IDEwMDAsIGxvY2kgPSAiLi4vZGF0YS9waWxldXAvR0wtV1QtMjRoci0zLnBpbGVfdXAzX3MxMF91LnVuaXEuYmVkIiwgYmluX3NpemUgPSAxMCwgdmVyYm9zZSA9IEYsem1heCA9IDUwKQpwNSA8LSBwbG90X2J3X2hlYXRtYXAoYndmaWxlID0gZm4kZmlsZXNbNV0sIG1vZGUgPSAiY2VudGVyIix1cHN0cmVhbSA9IDEwMDAsIGRvd25zdHJlYW0gPSAxMDAwLCBsb2NpID0gIi4uL2RhdGEvcGlsZXVwL0dMLVdULTI0aHItMy5waWxlX3VwM19zMTBfdS51bmlxLmJlZCIsIGJpbl9zaXplID0gMTAsIHZlcmJvc2UgPSBGLHptYXggPSA1MCkKcDYgPC0gcGxvdF9id19oZWF0bWFwKGJ3ZmlsZSA9IGZuJGZpbGVzWzZdLCBtb2RlID0gImNlbnRlciIsdXBzdHJlYW0gPSAxMDAwLCBkb3duc3RyZWFtID0gMTAwMCwgbG9jaSA9ICIuLi9kYXRhL3BpbGV1cC9HTC1XVC0yNGhyLTMucGlsZV91cDNfczEwX3UudW5pcS5iZWQiLCBiaW5fc2l6ZSA9IDEwLCB2ZXJib3NlID0gRix6bWF4ID0gNTApCgoKZ2dhcnJhbmdlKHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIG5jb2wgPSA2LCBucm93ID0gMSkKYGBgCgojIyBDVENGIHNpdGVzIC0gc3BhY2luZyAgcmVsYXRpdmUgdG8gbnVjbGVvc29tZXMgYW5kIGxpbmtlciBoaXN0b25lCgphcm91bmQgQ1RDRiBzaXRlcywgdGhlIEdMT0Utc2VxIHNpZ25hbCBsb29rZWQgdmVyeSBwZXJpb2RpYywgd2hpY2ggc3VnZ2VzdGVkIHRoYXQgdGhlcmUgY291bGQgYmUgYSByZWxhdGlvbnNoaXAgdG8gbnVjbGVvc29tZSBvY2N1cGFuY3kuIEluZGVlZCwgdGhlIHBhdHRlcm4gaXMgY29uc2lzdGVudCB3aXRoIENBRCBjdXR0aW5nIGxlZnQgYW5kIHJpZ2h0IG9mIGxpbmtlciBoaXN0b25lIC8gaW4tYmV0d2VlbiBsaW5rZXIgaGlzdG9uZSBhbmQgbnVjbGVvc29tZS4gTm90ZSB0aGF0IHRoZSBzYW1lIHBlcmlvZGljaXR5IGlzIGFsc28gc2VlbiBpbiB1bnRyZWF0ZWQgYW5kIENBRCBLTyBjb25kaXRpb25zLCBhbGJlaXQgbXVjaCBsZXNzIHByb25vdW5jZWQsIHN1Z2dlc3RpbmcgdGhhdCBDQUQtaW5kZXBlbmRlbnQgU1NCcyBhcmUgYWxzbyBvY2N1cmluZyBtb3JlIG9mdGVuIGluLWJldHdlZW4gbnVjbGVvc29tZXMuCgpgYGB7ciAgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4LCBmaWcuc2hvdz0iaG9sZCIsIHdhcm5pbmc9Rn0KCnBsdXMgPC0gYnVpbGRfZmlsZW5hbWVzX3BsdXMoZGF0YV9wYXRoLHNhbXBsZXMpCm1pbnVzIDwtIGJ1aWxkX2ZpbGVuYW1lc19taW51cyhkYXRhX3BhdGgsc2FtcGxlcykKCmhpc3RvbmVzIDwtIGMoJy9Wb2x1bWVzL0RBVEEvREFUQS9HTE9FL0dMT0UvR0VPL1RvcnJlczIwMTZfSDEwXzEuaGcxOS5idycsJy9Wb2x1bWVzL0RBVEEvREFUQS9HTE9FL0dMT0UvR0VPL1RvcnJlczIwMTZfSDE0XzIuaGcxOS5idycsJy9Wb2x1bWVzL0RBVEEvREFUQS9HTE9FL0dMT0UvR0VPL1UyT1NfQWNIM19DaElQc2VxLmhnMTkuYncnKQoKcDE8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGhpc3RvbmVzWzFdLGxhYmVscyA9IGMoIkgxLjAiKSxtb2RlID0gImNlbnRlciIsdXBzdHJlYW0gPSAxMDAwLCBkb3duc3RyZWFtID0gMTAwMCwgbG9jaSA9ICIuLi9nZW5vbWUvSENUMTE2X0NUQ0YuaGcxOS5iZWQiLCBiaW5fc2l6ZSA9IDEwLCB2ZXJib3NlID0gRiwgcmVtb3ZlX3RvcCA9IDAuMDAwMSkKCnAyPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBoaXN0b25lc1syXSxsYWJlbHMgPSBjKCJIMS40IiksbW9kZSA9ICJjZW50ZXIiLHVwc3RyZWFtID0gMTAwMCwgZG93bnN0cmVhbSA9IDEwMDAsIGxvY2kgPSAiLi4vZ2Vub21lL0hDVDExNl9DVENGLmhnMTkuYmVkIiwgYmluX3NpemUgPSAxMCwgdmVyYm9zZSA9IEYsIHJlbW92ZV90b3AgPSAwLjAwMDEpCgpwMzwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gaGlzdG9uZXNbM10sbGFiZWxzID0gYygiSDNhYyIpLG1vZGUgPSAiY2VudGVyIix1cHN0cmVhbSA9IDEwMDAsIGRvd25zdHJlYW0gPSAxMDAwLCBsb2NpID0gIi4uL2dlbm9tZS9IQ1QxMTZfQ1RDRi5oZzE5LmJlZCIsIGJpbl9zaXplID0gMTAsIHZlcmJvc2UgPSBGLCByZW1vdmVfdG9wID0gMC4wMDAxKQoKcDQ8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGMocGx1cyRmaWxlc1szXSxtaW51cyRmaWxlc1szXSksbGFiZWxzID0gYygiV1QgMjRoICsiLCJXVCAyNGggLSIpLG1vZGUgPSAiY2VudGVyIix1cHN0cmVhbSA9IDEwMDAsIGRvd25zdHJlYW0gPSAxMDAwLCBsb2NpID0gIi4uL2dlbm9tZS9IQ1QxMTZfQ1RDRi5oZzE5LmJlZCIsIGJpbl9zaXplID0gMTAsIHZlcmJvc2UgPSBGLCByZW1vdmVfdG9wID0gMC4wMDAxKQoKcDUgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBwbHVzJGZpbGVzW2MoMSwzLDYpXSxsYWJlbHMgPSBwbHVzJGxhYmVsc1tjKDEsMyw2KV0sbW9kZSA9ICJjZW50ZXIiLHVwc3RyZWFtID0gMTAwMCwgZG93bnN0cmVhbSA9IDEwMDAsIGxvY2kgPSAiLi4vZ2Vub21lL0hDVDExNl9DVENGLmhnMTkuYmVkIiwgYmluX3NpemUgPSAxMCwgdmVyYm9zZSA9IEYsIHJlbW92ZV90b3AgPSAwLjAwMDEpCgpwNiA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IG1pbnVzJGZpbGVzW2MoMSwzLDYpXSxsYWJlbHMgPSBtaW51cyRsYWJlbHNbYygxLDMsNildLG1vZGUgPSAiY2VudGVyIix1cHN0cmVhbSA9IDEwMDAsIGRvd25zdHJlYW0gPSAxMDAwLCBsb2NpID0gIi4uL2dlbm9tZS9IQ1QxMTZfQ1RDRi5oZzE5LmJlZCIsIGJpbl9zaXplID0gMTAsIHZlcmJvc2UgPSBGLCByZW1vdmVfdG9wID0gMC4wMDAxKQoKZ2dhcnJhbmdlKHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIG5jb2wgPSAzLCBucm93ID0gMikKYGBgCiMjIEROYXNlIGh5cGVyc2Vuc2l0aXZlIHNpdGVzIC0gc3BhY2luZyAgcmVsYXRpdmUgdG8gbnVjbGVvc29tZXMgYW5kIGxpbmtlciBoaXN0b25lCgpXaXRoIHRoZSByZW1vdmFsIG9mIGFydGlmYWN0dWFsIHJlZ2lvbnMsIHdlIG5vdyBhbHNvIGNhbiBzZWUgYSBuZWF0bHkgc3BhY2VkIHBhdHRlcm4gYXQgRE5Bc2UgaHlwZXJzZW5zaXRpdmUgc2l0ZXMuCgpgYGB7ciAgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4LCBmaWcuc2hvdz0iaG9sZCIsIHdhcm5pbmc9Rn0KCnBsdXMgPC0gYnVpbGRfZmlsZW5hbWVzX3BsdXMoZGF0YV9wYXRoLHNhbXBsZXMpCm1pbnVzIDwtIGJ1aWxkX2ZpbGVuYW1lc19taW51cyhkYXRhX3BhdGgsc2FtcGxlcykKCmhpc3RvbmVzIDwtIGMoJy9Wb2x1bWVzL0RBVEEvREFUQS9HTE9FL0dMT0UvR0VPL1RvcnJlczIwMTZfSDEwXzEuaGcxOS5idycsJy9Wb2x1bWVzL0RBVEEvREFUQS9HTE9FL0dMT0UvR0VPL1RvcnJlczIwMTZfSDE0XzIuaGcxOS5idycsJy9Wb2x1bWVzL0RBVEEvREFUQS9HTE9FL0dMT0UvR0VPL1UyT1NfQWNIM19DaElQc2VxLmhnMTkuYncnKQoKcDE8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGhpc3RvbmVzWzFdLGxhYmVscyA9IGMoIkgxLjAiKSxtb2RlID0gImNlbnRlciIsdXBzdHJlYW0gPSAxMDAwLCBkb3duc3RyZWFtID0gMTAwMCwgbG9jaSA9ICIuLi9nZW5vbWUvSENUMTE2X0RIUy5oZzE5LmJlZCIsIGJpbl9zaXplID0gMTAsIHZlcmJvc2UgPSBGLCByZW1vdmVfdG9wID0gMC4wMDAxKQoKcDI8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGhpc3RvbmVzWzJdLGxhYmVscyA9IGMoIkgxLjQiKSxtb2RlID0gImNlbnRlciIsdXBzdHJlYW0gPSAxMDAwLCBkb3duc3RyZWFtID0gMTAwMCwgbG9jaSA9ICIuLi9nZW5vbWUvSENUMTE2X0RIUy5oZzE5LmJlZCIsIGJpbl9zaXplID0gMTAsIHZlcmJvc2UgPSBGLCByZW1vdmVfdG9wID0gMC4wMDAxKQoKcDM8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGhpc3RvbmVzWzNdLGxhYmVscyA9IGMoIkgzYWMiKSxtb2RlID0gImNlbnRlciIsdXBzdHJlYW0gPSAxMDAwLCBkb3duc3RyZWFtID0gMTAwMCwgbG9jaSA9ICIuLi9nZW5vbWUvSENUMTE2X0RIUy5oZzE5LmJlZCIsIGJpbl9zaXplID0gMTAsIHZlcmJvc2UgPSBGLCByZW1vdmVfdG9wID0gMC4wMDAxKQoKcDQ8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGMocGx1cyRmaWxlc1szXSxtaW51cyRmaWxlc1szXSksbGFiZWxzID0gYygiV1QgMjRoICsiLCJXVCAyNGggLSIpLG1vZGUgPSAiY2VudGVyIix1cHN0cmVhbSA9IDEwMDAsIGRvd25zdHJlYW0gPSAxMDAwLCBsb2NpID0gIi4uL2dlbm9tZS9IQ1QxMTZfREhTLmhnMTkuYmVkIiwgYmluX3NpemUgPSAxMCwgdmVyYm9zZSA9IEYsIHJlbW92ZV90b3AgPSAwLjAwMDEpCgpwNSA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IHBsdXMkZmlsZXNbYygxLDMsNildLGxhYmVscyA9IHBsdXMkbGFiZWxzW2MoMSwzLDYpXSxtb2RlID0gImNlbnRlciIsdXBzdHJlYW0gPSAxMDAwLCBkb3duc3RyZWFtID0gMTAwMCwgbG9jaSA9ICIuLi9nZW5vbWUvSENUMTE2X0RIUy5oZzE5LmJlZCIsIGJpbl9zaXplID0gMTAsIHZlcmJvc2UgPSBGLCByZW1vdmVfdG9wID0gMC4wMDAxKQoKcDYgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBtaW51cyRmaWxlc1tjKDEsMyw2KV0sbGFiZWxzID0gbWludXMkbGFiZWxzW2MoMSwzLDYpXSxtb2RlID0gImNlbnRlciIsdXBzdHJlYW0gPSAxMDAwLCBkb3duc3RyZWFtID0gMTAwMCwgbG9jaSA9ICIuLi9nZW5vbWUvSENUMTE2X0RIUy5oZzE5LmJlZCIsIGJpbl9zaXplID0gMTAsIHZlcmJvc2UgPSBGLCByZW1vdmVfdG9wID0gMC4wMDAxKQoKZ2dhcnJhbmdlKHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIG5jb2wgPSAzLCBucm93ID0gMikKYGBgCg==